#pragma once 
#include <bits/stdc++.h>

/*****************************************************************************
 *! @brief shared_ptr使用引用计数，每个拷贝都指向相同的内存对象, 在最后一个shared_ptr析构
 *!        的时候, 原始对象的内存被释放.
 *
 * 
 * 
 * 
 *  
 ****************************************************************************/

template <typename T>
void shared_ptr_func_deleter(T* p) {
    if (p != nullptr) {
        delete p;
    }
    std::cout << "==========func deleter==========" << std::endl;
}

template <typename T>
struct shared_ptr_struct_deleter {
    constexpr shared_ptr_struct_deleter() noexcept = default;
    
    void operator()(T* p) {
        if (p != nullptr) {
            delete p;
        }
        std::cout << "==========operator() deleter==========" << std::endl;
    }
};

int std_shared_ptr();